package orm;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class DBManager implements IDBFacade
{
	//Objects spŽcifiques aux differents appels vers les bases (locales ou distantes).	
		public Connection			myConnect;	
		public Statement			myState;
		public ResultSet			myResultSet;

		//Objects de Meta-Information sur la Database connectŽe, et sur la requ�te effectuŽe.
		public DatabaseMetaData		myDbMetaData;
		public ResultSetMetaData	myResultSetMetaData;
		
		public PreparedStatement 	myPreparedStatement;

		public String 				arrayContent[][];
		public String 				arrayHeader[];
		public String 				strConnectURL;
		
		public DBManager()	{}

		//////////////////
		//SQL
		/////////////////
		
		/* + object.getClass().getSimpleName() + "*/
		
		@Override
		public void createObject(Object object) //recuperer objet conf transmit via DAO
		{
				System.out.println(object.getClass().getSimpleName());
			try {
				myState.executeUpdate("INSERT INTO "
						+ object.getClass().getSimpleName() + " (id, nom) VALUES('42', 'bibi')");
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			// INSERT INTO table (col1, col2, col3 ...) values(v1, v2, v3 ...)
			//test.getClass().getSimpleName();
		}
		
		public void /*List<Object>*/	readObject(/*Object object*/)
		{
			//5eme etape: invocation d'une requ�te (soit une selection stockee dans un ResultSet, soit un update/delete/insert renvoyant le nbr de ligne modifiee(s)).
			try
			{
				myResultSet					= myState.executeQuery("SELECT * FROM personne;");

				//int nbrRow				= myState.executeUpdate("Delete from personne where id=2");

				//Stockage de l'historique des requetes dans un fichier, histoire d'avoir un backup
				//IoManager.writeFile("Select * from personne;", "queryPerformer.sql", false); 

				//Option: Acces a un jeu de meta information sur la base avec laquelle on dialogue.
				myResultSetMetaData			= myResultSet.getMetaData();

				System.out.println("\r\nDBManager: dbConnect: show Query MetaData:");

				int nbrColumn;

				nbrColumn = myResultSetMetaData.getColumnCount();
				// TODO Auto-generated catch block
				List<String[]>	list		= new ArrayList<String[]>();
				arrayHeader					= new String[nbrColumn];

				//la premi�re colonne porte l'index 1, ET NON 0 !!!
				for (int i = 0; i != nbrColumn; i++)
				{

					arrayHeader[i]	= myResultSetMetaData.getColumnName(i + 1);


					System.out.println("DBManager: dbConnect: MetaInfo: columnName=" + myResultSetMetaData.getColumnName(i + 1) + ", columnType=" + myResultSetMetaData.getColumnTypeName(i + 1));
					//etc... de nombreuses autres info sont disponibles
				}

				System.out.println("\r\nDBManager: dbConnect: show Query Data:");

				//6eme etape: parcours du resultSet et de ses donnŽes.
				//la premi�re colonne porte l'index 1, ET NON 0 !!!
				while (myResultSet.next()) //incremente aussi l'index pour la lecture des donnŽes
				{
					String[] content 		= new String[nbrColumn];
					content[0]				= myResultSet.getString(1);         
					content[1]				= myResultSet.getString(2);         

					list.add(content);

					System.out.println("DBManager: dbConnect: resultSet 1st column=" 	+ content[0]); 
					System.out.println("DBManager: dbConnect: resultSet 2nd column=" 	+ content[1] + "\r\n"); 

					//l'object ResultSet peut invoker bon nombre de getters: 
					//getShort, getDouble, getInt, getByte, getBoolean, getBigDecimal, getBinaryStream, getAsciiStream, 
					//getDate, getFloat, getBlob, getClob...						
				}
			}
			catch (SQLException e) {e.printStackTrace();}
			
		}
		
		public void	dbConnect_()
		{
			//1ere etape: Chargement de la classe de driver, responsable - par contrat d'interfaces - de la connection vers le SGBD
			//Il existe 4 types de driver (I, II, III, IV): 2 locaux, et 2 remote. More infos: http://java.sun.com/jdbc/drivers.html
			//Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
			try 
			{
				Class.forName("com.mysql.jdbc.Driver");


				//2eme etape: Definition de l'URL de connection
				//strConnectURL				= "jdbc:odbc:java";
				strConnectURL				= "jdbc:mysql://localhost:3306/java";
				//ex d'URL permettant le connection distante: "jdbc:JDataConnect://www.domain.com/db-dsn"; 

				//3eme etape: Creation de l'object de connection
				myConnect = DriverManager.getConnection(strConnectURL, "root", "");


				//Option: Acces a un jeu de meta information sur la base avec laquelle on dialogue.
				myDbMetaData 				= myConnect.getMetaData();

				System.out.println("DBManager: dbConnect: show DataBase MetaData:");
				System.out.println("DBManager: dbConnect: productName=" 	+ myDbMetaData.getDatabaseProductName());
				System.out.println("DBManager: dbConnect: productVersion=" 	+ myDbMetaData.getDatabaseProductVersion());
				//etc... de nombreuses autres info sont disponibles

				//4eme etape: creation d'une instruction/formule, socle pour executer des requetes
				myState						= myConnect.createStatement();
				System.out.println("Connection serveur SQL reussie...");
			}
			catch (SQLException e) {System.out.println("dbConnect SQLException: " + e.toString()); e.printStackTrace();}//login & password
			catch (ClassNotFoundException e) {System.out.println("dbConnect ClassNotFoundException: " + e.toString()); e.printStackTrace();}
		}

		//////////////////
		//MISC
		/////////////////
		
		public static String escapeQuote(String strIn)
		{	
			if (strIn == null)
				return "";
			
			String strOut		= "";
			int strLength		= strIn.length();
					
			for (int i = 0; i != strLength; i++)
				strOut			+= (strIn.substring(i, i + 1).equalsIgnoreCase("'"))? "''" : strIn.substring(i, i + 1);
			
			return strOut;
		}	

}
